package br.ufc.great.dtx.dm;

import java.io.IOException;
import java.io.StringReader;

import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

import br.ufc.great.dtx.server.DTXOutput;
import br.ufc.great.xml.XMLDocument;

/**
 * 
 * @author Leonardo Oliveira Moreira
 *
 * Interface que define os métodos de acesso aos dados XML pelo mecanismo de armazenamento
 */
public abstract class DataManager {

	protected XMLDocument document = null;
	protected DTXOutput output = null;
	
	public DataManager(DTXOutput output) {
		this.output = output;
	}
	
	/**
	 * Método utilizado para realizar uma conexão ao meio de armazenamento
	 * 
	 * @param dataBase
	 * @param url
	 * @param user
	 * @param password
	 * @return
	 * @throws IOException
	 */
	public abstract boolean connect(String dataBase, String url, String user, String password) throws IOException;

	/**
	 * M�todo utilizado para fechar a conex�o ativa
	 */
	public abstract void close();
	
	/**
	 * M�todo utilizado para carregar um documento e transformar em um objeto XMLDocument
	 * 
	 * @param documentName
	 * @return
	 * @throws IOException
	 */
	public abstract XMLDocument loadDocument(String documentName) throws IOException;

	/**
	 * M�todo utilizado para atualizar um documento XML
	 * 
	 * @param name
	 * @param document
	 * @return
	 * @throws IOException
	 */
	public abstract boolean updateDocument(String name, XMLDocument document) throws IOException;
	
	/**
	 * M�todo para transformar uma string XML em um XMLDocument
	 * 
	 * @param strDocument
	 * @return
	 * @throws IOException
	 */
	protected XMLDocument stringToDocument(String name, String strDocument) throws IOException {
		XMLDocument xmlDocument = null;
		try {
			SAXBuilder saxBuilder = new SAXBuilder();
		    Document document = saxBuilder.build(new StringReader(strDocument));
		    xmlDocument = new XMLDocument(document, name);
		}
		catch (IOException e) {
			throw e;
		}
		catch (JDOMException e) {
			throw new IOException(e);
		}
		return xmlDocument;
	}
	
	/**
	 * M�todo utilizado para inicializar o servi�o
	 * 
	 * @param dataBase
	 * @throws IOException
	 */
	public abstract void start(String dataBase) throws IOException;
	
	/**
	 * M�todo utilizado para finalizar o servi�o
	 * 
	 * @param dataBase
	 * @throws IOException
	 */
	public abstract void stop(String dataBase) throws IOException;
	
	/**
	 * M�todo utilizado para recuperar o documento XML configurado
	 * 
	 * @return
	 */
	public XMLDocument getXMLDocument() {
		return document;
	}
	
	/**
	 * M�todo utilizado para configurar um documento XML 
	 * 
	 * @param document
	 */
	public void setXMLDocument(XMLDocument document) {
		this.document = document;
	}
	
}
